/*******************************************************************************
 * Includes
 ******************************************************************************/
#include "core/include/hc32f4a0_pwc.h"
#include "core/include/hc32f4a0_sram.h"
#include "core/include/hc32f4a0_clk.h"
#include "core/include/hc32f4a0_tick.h"
#include "armv7m/armv7_core_m4.h"
#include "driver/gpio/hc32f4a0_gpio.h"
#include "driver/efm/hc32f4a0_efm.h"

/*******************************************************************************
 * Code
 ******************************************************************************/
/**
 * \brief 系统外围设备写使能
 */
void sys_peripheral_we(void){
    /* GPIO 寄存器写使能*/
    gpio_unlock();
    /* PWC FCG0 写使能*/
    pwc_fcg0_unlock();
    /* CMU 及电源控制相关寄存器写使能*/
    pwc_unlock(PWC_UNLOCK_CODE_0 | PWC_UNLOCK_CODE_1);
    /* SRAM 等待寄存器写使能*/
    sram_wtcr_unlock();
    /* SRAM 校验控制寄存器写使能*/
    sram_ckcr_unlock();
    /* EFM 擦写模式寄存器写使能*/
    efm_fwmc_unlock();
    /* EFM 访问写使能*/
    efm_unlock();
}

/**
 * \brief 系统外围设备写保护
 */
void sys_peripheral_wp(void){
    /* GPIO 寄存器写保护*/
    gpio_lock();
    /* PWC FCG0 写保护*/
    pwc_fcg0_lock();
    /* CMU 及电源控制相关寄存器写保护*/
    pwc_lock(PWC_UNLOCK_CODE_0 | PWC_UNLOCK_CODE_1);
    /* SRAM 等待寄存器写保护*/
    sram_wtcr_lock();
    /* SRAM 校验控制寄存器写保护*/
    sram_ckcr_lock();
    /* EFM 擦写模式寄存器写保护*/
    efm_fwmc_lock();
    /* EFM 访问写保护*/
    efm_lock();
}

/**
 * \brief 系统初始化
 */
void system_init(void){
#if 1
    /* 设置浮点运行，设置协处理器 CP10 和 CP11 全访问 */
    ARMV7M_SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2));
#endif
    /* 把中断向量表定义到启动代码中，当中断向量表位置不再 0x00000000 时 */
    extern uint32_t __Vectors[];
    ARMV7M_SCB->VTOR = (uint32_t)__Vectors;
}

